﻿namespace PropOnline.Controllers
{
    using System.Web.Mvc;
    using PropOnline.Helpers;
    using PropOnline.Models;
    using PropOnline.Stores;
    using PropOnline.ViewModels.Shared;

    public abstract class BusquedaBaseController<TBusquedaViewModel, TResultadoViewModel> : Controller 
        where TBusquedaViewModel : BusquedaViewModelBase 
        where TResultadoViewModel : ResultadoViewModelBase
    {
        [HttpGet]
        public ActionResult Index()
        {
            return RedirectToAction("Buscar");
        }
        
        [HttpGet]
        public ActionResult Buscar(TBusquedaViewModel busquedaViewModel)
        {
            if (Request.QueryString.Count == 0)
            {
                ModelState.Clear();
            }

            busquedaViewModel.Operacion = busquedaViewModel.Operacion ?? Operacion.Venta;
            busquedaViewModel.TipoPropiedad = busquedaViewModel.TipoPropiedad ?? TipoPropiedad.Todos;
            busquedaViewModel.OperacionSelectList = EnumExtensions.ToSelectList(typeof(Operacion), busquedaViewModel.Operacion);
            busquedaViewModel.TipoPropiedadSelectList = EnumExtensions.ToSelectList(typeof(TipoPropiedad), busquedaViewModel.TipoPropiedad);
            busquedaViewModel.ZonaSelectList = new SelectList(new BusquedaStore().Zonas, "Id", "Nombre", busquedaViewModel.ZonaId);
            
            this.CompleteBusquedaViewModel(busquedaViewModel);

            return View(busquedaViewModel);
        }

        [HttpPost]
        [ActionName("Busqueda")]
        public ActionResult BusquedaPost(TBusquedaViewModel busquedaViewModel)
        {
            if (Request.IsAjaxRequest())
            {
                if (!ModelState.IsValid)
                {
                    return new HttpStatusCodeResult(400, PropOnlineConstants.Error400Message);
                }

                return PartialView("_ResultadoPropiedades", this.GetResultadoPropiedadesViewModel(busquedaViewModel));
            }

            if (!ModelState.IsValid)
            {
                return RedirectToAction("Buscar", BusquedaHelper.GetBusquedaRouteValues(busquedaViewModel));
            }

            var resultado = this.GetResultadoViewModel(busquedaViewModel);

            return View("Resultado", "_Layout", resultado);
        }

        [HttpGet]
        [ActionName("Busqueda")]
        public ActionResult BusquedaGet(TBusquedaViewModel busquedaViewModel)
        {
            if (!ModelState.IsValid)
            {
                return RedirectToAction("Buscar", BusquedaHelper.GetBusquedaRouteValues(busquedaViewModel));
            }

            var resultado = this.GetResultadoViewModel(busquedaViewModel);

            return View("Resultado", "_Layout", resultado);
        }

        protected virtual TBusquedaViewModel CompleteBusquedaViewModel(TBusquedaViewModel busquedaViewModel)
        {
            return busquedaViewModel;
        }

        protected abstract ResultadoPropiedadesViewModel GetResultadoPropiedadesViewModel(TBusquedaViewModel busquedaViewModel);

        protected abstract TResultadoViewModel GetResultadoViewModel(TBusquedaViewModel busquedaViewModel);        
    }
}
